// 版权所有2009 Go作者。保留所有权利。
// 此源代码的使用受BSD样式
// 许可证的约束，该许可证可以在许可证文件中找到。

package os

import (
	"runtime"
	"syscall"
)

func hostname() (name string, err error) {
	// 首先尝试uname，因为这只是一个系统调用，在Android上不允许从/proc读取
	// 。
	var un syscall.Utsname
	err = syscall.Uname(&un)

	var buf [512]byte // 足够一个DNS名称。
	for i, b := range un.Nodename[:] {
		buf[i] = uint8(b)
		if b == 0 {
			name = string(buf[:i])
			break
		}
	}
	// 如果我们得到了一个名称，但它可能没有被截断
	// （Nodename是65字节），请返回它。
	if err == nil && len(name) > 0 && len(name) < 64 {
		return name, nil
	}
	if runtime.GOOS == "android" {
		if name != "" {
			return name, nil
		}
		return "localhost", nil
	}

	f, err := Open("/proc/sys/kernel/hostname")
	if err != nil {
		return "", err
	}
	defer f.Close()

	n, err := f.Read(buf[:])
	if err != nil {
		return "", err
	}

	if n > 0 && buf[n-1] == '\n' {
		n--
	}
	return string(buf[:n]), nil
}
